
/*
 * Datei: pointstack.c
 * Aufgabe: Funktionen zur Bearbeitung des Stack und Ein-/Ausgabe
 */
#include <stdio.h>
#include <stdlib.h>
#include "pointstack.h"

struct stackPoint{
	POINT point;
	struct stackPoint *next;
};
typedef struct stackPoint STACK_POINT;
typedef STACK_POINT *STACK_POINT_PTR;


//aus Sicherheitsgründen static
static STACK_POINT_PTR stackTop = NULL;

void push(POINT pushPoint){
	
	STACK_POINT_PTR newStackPoint;
	
		
	/* 
	 * Speicher für neuen Punkt reservieren 
	 * Ausgabe einer Fehlermeldung, falls zu wenig Speicher vorhanden
	 */
	if((newStackPoint = (STACK_POINT_PTR) malloc(sizeof(STACK_POINT))) == NULL){
		printf("ERROR: Speicherzuweisungsfehler!\n");
		exit(2);
	}
	newStackPoint->point = pushPoint;
	
	/* setzen des "next" Zeigers auf das vorherige Element */
	newStackPoint->next = stackTop;
	/* stackTop auf oberstes Element des Stacks setzen */
		stackTop = newStackPoint;
}

POINT pop(void){
	
	POINT returnPoint;
	STACK_POINT_PTR oldPoint;
	
	/* falls pop() aufgerufen wird, und stackTop null ist, wird eine Fehlermeldung 
		geschrieben, dieser fall kann jedoch in diesem Programm nicht auftreten.*/
	if(stackTop == NULL){
		printf("ERROR: pop() konnte wegen leerem Stack nicht ausgefuehrt werden\n");
		exit(1);
	}
	
	/* oberstes Element als Rückgabeparameter */
	returnPoint = stackTop->point;
	/*
	 * Zwischenspeichern des alten stackTop
	 * und stackTop auf das nächste Element setzen
	 */
	oldPoint = stackTop;
	stackTop = stackTop->next;
	
	/* Freigabe des nicht mehr benötigten Speichers */
	free(oldPoint);
	return returnPoint;
}

int isEmpty(void){
	/* Rückgabewert: 1, wenn leer; 0, wenn nicht leer */
	return stackTop == NULL;
}

void printStackElement(POINT aPoint){
	printf("x=%g \t y=%g \t z=%g \n", aPoint.x, aPoint.y, aPoint.z);
}
